GitHub MCPを使って、PRレビューを自動化するCopilotプロンプトを作ってみた

前回、GitHub MCPを使ってPR作成を自動化してみましたが、今回は「コードレビュー」を自動化するプロンプトを作ってみました。

作成した背景

PRを作るのが楽になっても、その後のレビューがボトルネックになることってありますよね。今回これを作った背景はこんな感じです。

  1. 業務でのレビュー工数を減らしたい 単純なバグや仕様との食い違いみたいな指摘はAIに任せて、人間はもっと設計思想とか深い部分のレビューに集中したいなと。
  2. 個人開発でもしっかりとレビューをしていきたい 個人開発だと、実装してそのままマージ!としがちです。でも、後で「なんでこんな実装したんだ…」とならないように、第三者(AI)の視点でチェックを入れるフローを作りたかったんです。

作成したプロンプト

実際に作成して、個人開発で使用を始めたプロンプトがこちらです。 例えば .github/prompts/pr-reviewer.prompt.md などのパスに置いて使っています。

下記はそのまま使用できます。

---
description: GitHub MCPを使用して、対象のPull Requestをレビューし、コメントを投稿するためのプロンプト
---

## ユーザー入力

```
$ARGUMENTS
```

**重要:**

1. 処理を開始する前に、上記のユーザー入力(重点的に見てほしい箇所や、特定の懸念点など)を確認し、反映してください。

2. **関連資料(SpeckitのURL、仕様書、Issueへのリンク等)** がある場合は、それを基準に仕様との整合性を確認してください。

## 概要

指定された(または現在のコンテキスト上の)Pull Request の変更内容を読み込み、コードレビューを行います。バグ、可読性、セキュリティ、仕様との整合性などの観点からチェックし、レビューコメントを作成・投稿します。

# 実行フロー

## 0. 関連資料と対象PRの確認(対話ステップ)

**ユーザー入力 `$ARGUMENTS` を確認してください。**

1. **関連資料の有無:** 仕様書やSpeckitのURLが含まれているか?
   * なければ、「レビューにあたり、参照すべき仕様書や資料はありますか?(なければ一般的なコード品質の観点でレビューします)」と確認してください。

2. **対象PRの特定:** PR番号やURLが指定されているか?
   * 指定がない場合、`current_branch` に紐づくPRを検索するか、ユーザーに「どのPRをレビューしますか?」と尋ねてください。

## 1. PR情報の取得

以下の情報を取得してください。

1. **PRの基本情報:** タイトル、本文、関連するIssue番号。
   * ツール: `get_pull_request` (または `list_pull_requests` から特定)

2. **変更差分(Diff):** どのような変更が行われたか。
   * ツール: `get_pull_request_diff` または `git diff base...head`
   * *※差分が大きい場合は、重要なファイルやユーザーが指定したファイルを優先して読み込んでください。*

## 2. コードレビューの実施(思考プロセス)

取得した差分と関連資料をもとに、以下の観点で分析を行ってください。

* **機能要件:** 仕様書(ある場合)やPRのタイトル・本文の目的を満たしているか?
* **バグ・不具合:** ロジックエラー、エッジケースの考慮漏れはないか?
* **可読性・保守性:** 命名規則、コードの構造、コメントは適切か?
* **セキュリティ:** 脆弱性(SQLインジェクション、XSS、機密情報の露出など)はないか?
* **パフォーマンス:** 非効率な処理(N+1問題、無駄なループ、メモリリークの懸念など)はないか?
* **テスト:** 変更に対する適切なテストコード(ユニットテスト、結合テスト等)が含まれているか? カバレッジやケース網羅性は十分か?

## 3. レビューコメント案の作成

分析結果をもとに、レビューコメントのドラフトを作成します。
**肯定的な点**(良い実装)も積極的に評価しつつ、改善点を指摘してください。
**特定の行に対する指摘がある場合は、必ずファイルパスと行番号を特定してください。**

**出力フォーマット:**

```
## レビューサマリー
(全体的な感想、承認/修正要求の判断目安)

## 検出された課題・改善提案(インラインコメント用)
- [ ] **{{ファイルパス}} ({{行番号}}行目):**
  - 指摘内容: ...
  - 提案コード(あれば): ...

- [ ] **{{ファイルパス}} ({{行番号}}行目):**
  - 指摘内容: ...

## 全体への質問・確認事項
- ...
```

**確認アクション:**
作成した「レビューコメント案」をユーザーに提示し、内容の承認を得てください。
「この内容でコメントを投稿しますか? 修正点はありますか?」

## 4. GitHub MCPによる実行

ユーザーの承認が得られたら、GitHub MCPツールを使用してコメントを投稿してください。
可能な限り、**特定の行に対する指摘はインラインコメント(レビューコメント)として投稿**してください。

* **使用ツール:** `create_pull_request_review` (推奨)
* **引数:**
  * `owner`: {{ owner }}
  * `repo`: {{ repo }}
  * `pull_number`: {{ pull_request_number }}
  * `event`: "COMMENT", "APPROVE", "REQUEST_CHANGES" のいずれか
  * `comments`: 以下の形式の配列(インラインコメント用)
    ```json
    [
      {
        "path": "{{ファイルパス}}",
        "line": "{{行番号}}",
        "body": "{{指摘内容}}"
      }
    ]
    ```
  * `body`: {{ レビューサマリーや全体へのコメント }}

* **代替ツール:** `create_issue_comment` (行指定が不要な場合や、タイムライン全体へのコメントのみの場合)

## エラーハンドリング

* 差分の取得に失敗した場合や、トークン制限にかかった場合は、ファイル単位で分割して読み込むなどの代替案を提示してください。

工夫したポイント

レビュー観点の明確化

漠然と「レビューして」と言うと、表面的なコードスタイルの指摘ばかりになりがちです。 そこで、「セキュリティ」「パフォーマンス」「テスト」といった具体的な観点を思考プロセスに組み込みました。これにより、人間が見落としがちなエッジケースや脆弱性の指摘も期待できます。

資料との整合性チェック

PR作成プロンプトと同様、仕様書(Speckitなど)を参照できるようにしています。 「仕様ではこうなっているはずだけど、実装はこうなっています」という指摘は、コンテキストを持ったAIならではの強みですね。

使ってみた感触と課題

実際に個人開発で使い始めてみたところ、レビューコメント自体はしっかりと残るようになりました。「あ、ここ考慮漏れてたわ」という気付きも結構あります。

ただ、正直なところ インラインレビュー(行単位のコメント) はまだ課題があります。 プロンプトでは create_pull_request_review を使って、特定の行にコメントするように指示しているのですが、該当箇所への参照リンクにはなるもののインラインコメントとしては表示されなかったりすることが多いです。

現状は「全体コメントで指摘内容を確認して、修正する」という運用でカバーしていますが、ここがバシッと決まるようになると、さらに体験が良くなりそうです。